package com.iot.show;

import android.app.Application;
import android.content.Context;
import android.util.Log;

import com.aliyun.alink.dm.api.DeviceInfo;
import com.aliyun.alink.linkkit.api.ILinkKitConnectListener;
import com.aliyun.alink.linkkit.api.IoTMqttClientConfig;
import com.aliyun.alink.linkkit.api.LinkKit;
import com.aliyun.alink.linkkit.api.LinkKitInitParams;
import com.aliyun.alink.linksdk.cmp.connect.channel.MqttSubscribeRequest;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectSubscribeListener;
import com.aliyun.alink.linksdk.tmp.device.payload.ValueWrapper;
import com.aliyun.alink.linksdk.tools.AError;
import com.iot.show.utils.T;

import java.util.HashMap;
import java.util.Map;

import static android.content.ContentValues.TAG;


public class MyApplication extends Application {

    private static MyApplication app;
    private static Context appContext;

    public static Context getAppContext() {
        return appContext;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        appContext = this;
        T.init(this);
        initMQTT();
    }

    void initMQTT() {
        /*
         * 设置设备三元组信息
         */
        DeviceInfo deviceInfo = new DeviceInfo();
        deviceInfo.productKey = "a1PSxXcK0W2";// 产品类型
        deviceInfo.deviceName = "DL33_APP";// 设备名称
        deviceInfo.deviceSecret = "cd6b94395461f9ab62d159445028dd1f";// 设备密钥
        //如果使用deviceToken和clientID连接物联网平台，那么设备的deviceSecret需要设置为null

        //一型一密免白名单动态注册之后建联需要设置deviceToken、clientId这两个值，这两个值由deviceDynamicRegister接口返回
//        MqttConfigure.deviceToken = "deviceToken";
//        MqttConfigure.clientId = "clientId";

        /*
         * 设置设备当前的初始状态值，属性需要和云端创建的物模型属性一致
         * 如果这里什么属性都不填，物模型就没有当前设备相关属性的初始值。
         * 用户调用物模型上报接口之后，物模型会有相关数据缓存。
         */
        Map<String, ValueWrapper> propertyValues = new HashMap<>();
        // 示例
        // propertyValues.put("LightSwitch", new ValueWrapper.BooleanValueWrapper(0));

        IoTMqttClientConfig clientConfig = new IoTMqttClientConfig(deviceInfo.productKey, deviceInfo.deviceName, deviceInfo.deviceSecret);

        LinkKitInitParams params = new LinkKitInitParams();
        params.deviceInfo = deviceInfo;
        params.propertyValues = propertyValues;
        params.mqttClientConfig = clientConfig;
        /**
         * 设备初始化建联
         * onError 初始化建联失败，需要用户重试初始化。如因网络问题导致初始化失败。
         * onInitDone 初始化成功
         */
        LinkKit.getInstance().init(getAppContext(), params, new ILinkKitConnectListener() {

            @Override
            public void onError(AError aError) {
                T.error("连接服务器失败：" + aError.getMsg());
                Log.e(TAG, "onError: " + aError);
            }

            @Override
            public void onInitDone(Object data) {
                // 初始化成功 data 作为预留参数
                T.success("连接服务器成功！");
                subTopic();
            }
        });

    }

    void subTopic() {
        // 订阅
        MqttSubscribeRequest subscribeRequest = new MqttSubscribeRequest();
        // subTopic 替换成用户自己需要订阅的 topic
        subscribeRequest.topic = "/a1PSxXcK0W2/DL33_APP/user/get";
        subscribeRequest.isSubscribe = true;
        subscribeRequest.qos = 0; // 支持0或者1
        LinkKit.getInstance().subscribe(subscribeRequest, new IConnectSubscribeListener() {
            @Override
            public void onSuccess() {
                // 订阅成功
                Log.e(TAG, "onSuccess: subTopic");
            }

            @Override
            public void onFailure(AError aError) {
                // 订阅失败
                Log.e(TAG, "onFailure: "+aError.getCode());
            }
        });
    }

}
